/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2014 All Rights Reserved.
 */
package com.alipay.dispatcher;

import com.alipay.api.internal.util.StringUtils;
import com.alipay.common.MyException;
import com.alipay.constants.AlipayServiceEventConstants;
import com.alipay.constants.AlipayServiceNameConstants;
import com.alipay.executor.*;
import com.alipay.util.LogUtil;
import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;

import java.util.Map;

/**
 * ҵ�����ַ���
 *
 * @author taixu.zqq
 * @version $Id: Dispatcher.java, v 0.1 2014��7��24�� ����4:59:58 taixu.zqq Exp $
 */
public class Dispatcher {

    /**
     * ����ҵ�������ȡҵ��ִ����
     *
     * @param params
     * @return
     * @throws MyException
     */
    public static ActionExecutor getExecutor(Map<String, String> params) throws MyException {
        //��ȡ������Ϣ
        String service = params.get("service");
        if (StringUtils.isEmpty(service)) {
            throw new MyException("�޷�ȡ�÷�����");
        }
        //��ȡ������Ϣ
        String bizContent = params.get("biz_content");
        if (StringUtils.isEmpty(bizContent)) {
            throw new MyException("�޷�ȡ��ҵ��������Ϣ");
        }

        //��XMLת����json����
        JSONObject bizContentJson = (JSONObject) new XMLSerializer().read(bizContent);

        // 1.��ȡ��Ϣ������Ϣ
        String msgType = bizContentJson.getString("MsgType");
        if (StringUtils.isEmpty(msgType)) {
            throw new MyException("�޷�ȡ����Ϣ����");
        }

        // 2.������Ϣ����(msgType)����ִ�����ķ���ת��
        //  2.1 ���ı���������
        LogUtil.log("msgType 你好:", msgType);
        if ("text".equals(msgType)) {

            return new InAlipayChatTextExecutor(bizContentJson);

            // 2.2 �¼�����
        } else if ("event".equals(msgType)) {

            return getEventExecutor(service, bizContentJson);

        } else {

            // 2.3 ����֧�������������������ͣ����Ĭ�Ϸ���ackӦ��
            return new InAlipayDefaultExecutor(bizContentJson);
        }

    }

    /**
     * �����¼�����ϸ�����Ҷ�Ӧִ����
     *
     * @param service
     * @param bizContentJson
     * @return
     * @throws MyException
     */
    private static ActionExecutor getEventExecutor(String service, JSONObject bizContentJson)
                                                                                             throws MyException {
        // 1. ��ȡ�¼�����
        String eventType = bizContentJson.getString("EventType");

        if (StringUtils.isEmpty(eventType)) {
            throw new MyException("�޷�ȡ���¼�����");
        }

        // 2.�����¼������ٴ����ַ�������
        // 2.1 ������֤������ģʽ
        if (AlipayServiceNameConstants.ALIPAY_CHECK_SERVICE.equals(service)
            && eventType.equals(AlipayServiceEventConstants.VERIFYGW_EVENT)) {

            return new InAlipayVerifyExecutor();

            // 2.2 ������Ϣ֪ͨ��
        } else if (AlipayServiceNameConstants.ALIPAY_PUBLIC_MESSAGE_NOTIFY.equals(service)) {

            return getMsgNotifyExecutor(eventType, bizContentJson);

            // 2.3 ���ں���֧�����������������ͣ�ͳһĬ�Ϸ���AKC��Ӧ
        } else {
            return new InAlipayDefaultExecutor(bizContentJson);
        }
    }

    /**
     * �����¼�ִ����
     *
     * @param bizContentJson
     * @return
     */
    private static ActionExecutor getEnterEventTypeExecutor(JSONObject bizContentJson) {
        try {

            JSONObject param = JSONObject.fromObject(bizContentJson.get("ActionParam"));
            JSONObject scene = JSONObject.fromObject(param.get("scene"));

            if (!StringUtils.isEmpty(scene.getString("sceneId"))) {

                //�Զ��峡��������������¼�
                return new InAlipayDIYQRCodeEnterExecutor(bizContentJson);
            } else {

                //��ͨ��������¼�
                return new InAlipayEnterExecutor(bizContentJson);
            }
        } catch (Exception exception) {
            //�޷�����sceneId�������Ϊ��ͨ��������¼�
            return new InAlipayEnterExecutor(bizContentJson);
        }
    }

    /**
     * �����¼�����(eventType)����ִ�����ķ���ת��
     *
     * @param eventType
     * @param bizContentJson
     * @return
     * @throws MyException
     */
    private static ActionExecutor getMsgNotifyExecutor(String eventType, JSONObject bizContentJson)
            throws MyException {
        if (eventType.equals(AlipayServiceEventConstants.FOLLOW_EVENT)) {

            // ���񴰹�ע�¼�
            return new InAlipayFollowExecutor(bizContentJson);

        } else if (eventType.equals(AlipayServiceEventConstants.UNFOLLOW_EVENT)) {

            //  ����ȡ����ע�¼�
            return new InAlipayUnFollowExecutor(bizContentJson);

            //����actionParam����ִ������ת��
        } else if (eventType.equals(AlipayServiceEventConstants.CLICK_EVENT)) {

            // ����¼�
            return getClickEventExecutor(bizContentJson);

        } else if (eventType.equals(AlipayServiceEventConstants.ENTER_EVENT)) {

            // �����¼�
            return getEnterEventTypeExecutor(bizContentJson);

        } else {

            // ���ں���֧�����������������ͣ�ͳһĬ�Ϸ���AKC��Ӧ
            return new InAlipayDefaultExecutor(bizContentJson);
        }

    }

    /**
     * ����¼�ִ����
     *
     * @param bizContentJson
     * @return
     */
    private static ActionExecutor getClickEventExecutor(JSONObject bizContentJson) {

        String actionParam = bizContentJson.getString("ActionParam");

        if ("authentication".equals(actionParam)) {

            //���뿪���߻�Ա���¼�:  actionParam֧�������񴰹̶�ֵ
            //TODO ����������ʵ�֣�������������Ҫ�󶨿����߻�Ա��������ʵ��
            return null;
        } else if ("delete".equals(actionParam)) {

            //ɾ�������߻�Ա���¼���actionParam֧�������񴰹̶�ֵ
            //TODO ����������ʵ�֣�������������Ҫ�󶨿����߻�Ա��������ʵ��
            return null;

            // ������֧��������key�⣬����keyΪ���������ò˵�ʱ�Զ���
        } else {

            //���񴰲˵�����¼���actionParam�����߿����Զ��壬��������authentication��delete�ظ��������ַ���,û������Ҫ��
            //"async_image_text"��Ϊ�������Զ�����첽����ͼ����Ϣ�Ĳ˵�key������ֻ�Ǹ���������
            LogUtil.log("actionParam ", actionParam);
            if ("async_image_text".equals(actionParam)) {

                // �������õĲ˵����庬�壬�����߽���ҵ��Ӧ������ֻ�Ǹ�����
                return new InAlipayAsyncMsgSendExecutor(bizContentJson);

                // �����˵�key�뿪�������в���,��ִ�п�����Ӧ��Ӧ
            } else if ("toPayWangbaList".equals(actionParam)) {
                return new InAlipayAsyncMsgSendExecutor(bizContentJson);
                // TODO �����߸���key���п�����Ӧ��Ӧ������ֻ�Ǹ�����
            } else {
                // TODO �����߸���key���п�����Ӧ��Ӧ������ֻ�Ǹ�����
                return null;
            }
        }
    }
}
